package org.pcorp.battlespace.construction.service;

import org.pcorp.battlespace.construction.modele.ConstructionUtils;
import org.pcorp.battlespace.construction.modele.VaisseauCstr;
import org.pcorp.battlespace.modele.Equipement;
import org.pcorp.battlespace.modele.equipement.Sabord;

public class CalculEquipageFrappeur implements CalculEquipageAble {

	@Override
	public long getEquipagePasserelle(VaisseauCstr vaiss) {
		long nbrEquip = 0;
		int nbr_sab = vaiss.getSabords().size();
		
		
		nbrEquip = nbr_sab*2 + 1; // ctrl de tir
		nbrEquip += getOpBarreur(vaiss)*2; // barreur + nav
		nbrEquip += getOpEquip(vaiss); // equipement
		
		nbrEquip += 2; // cmd + cmd en second
		
		return nbrEquip;
	}

	private long getOpEquip(VaisseauCstr vaiss) {
		long nbr = 0;
		for (Equipement equip : vaiss.getEquipements()) {
			nbr += equip.getOperateurs();
		}
		return nbr;
	}
	
	private long getOpBarreur(VaisseauCstr vaiss){
		int type = ConstructionUtils.getTypeFrp(vaiss.getMasse());
		
		switch (type) {
			case ConstructionUtils.SW_CORV:
				return 1;
			
			case ConstructionUtils.SW_FREG:
				return 2;
			
			case ConstructionUtils.SW_CRSL:
				return 2;
				
			case ConstructionUtils.SW_CRSM:
				return 3;
				
			case ConstructionUtils.SW_CRSH:
				return 3;
				
			case ConstructionUtils.SW_CRSB:
				return 4;
				
			case ConstructionUtils.SW_CUIR:
				return 6;
				
			default:
				return 1;
		}
	}
	
	@Override
	public long getEquipageArmement(VaisseauCstr vaiss) {
		long personnel = 0;
		
		for (Sabord sabord : vaiss.getSabords()) {
			for (Equipement armement : sabord.getArmements()) {
				personnel += armement.getOperateurs();
			}
		}
		return personnel;
	}

	@Override
	public long getEquipagePropulsion(VaisseauCstr vaiss) {
		return Math.round(vaiss.getPropMasse()/1250l);
	}

	@Override
	public long getEquipageKf(VaisseauCstr vaiss) {
		return Math.round(vaiss.getKfMasse()/10000l);
	}

	@Override
	public long getEquipageMaintenance(VaisseauCstr vaiss) {
		return Math.round(vaiss.getStructureMasse()/100);
	}

	@Override
	public long getEquipageDivers(VaisseauCstr vaiss) {
		long equipTotal = vaiss.getEquipageArmement();
		equipTotal += vaiss.getEquipageKF();
		equipTotal += vaiss.getEquipageMaintenance();
		equipTotal += vaiss.getEquipagePasserelle();
		equipTotal += vaiss.getEquipagePropulsion();
		
		
		return Math.round((equipTotal/30) + (equipTotal/100));
	}

}
